// `timescale 1ns / 1ps


// module drink_up(
//     input clk,    //时钟
//     input rst,    //复位键

//     );

//     reg [0:2] key_out;   //按键值
//     reg [0:20] cnt_xd = 0;    //消抖计时
//     reg [0:28] cs;    //计时3s
//     reg [0:2] cnt_wz = 0;    
//     reg [0:17] cnt;
//     reg [0:25] cnt_s = 0;     //闪烁计时
//     reg [0:3] count = 0;   //用于移位的计数
//     reg [0:7] wz;   //决定哪一位数码管亮
//     reg [0:6] money = 0;   //输入的钱数
//     reg [0:6] price = 3;   //饮料价格
//     reg [0:6] zj = 3;   //总价
//     reg [0:5] sl = 1;   //饮料数量
//     reg [0:6] change = 0;  //找零数
//     reg [0:3] num = 0;    
//     reg [0:7] smg;
//     reg [7:0] cd = 0;  //传递变量
//     reg [0:7] light;   //LED灯状态
//     reg [17:0] shift_reg = 0;    //移位寄存器
//     reg [0:3] gw;   //个位
//     reg [0:3] sw;   //十位
//     reg DIR = 1'b0;   //分频计
//     reg zt = 1'b0;   //状态
//     reg shine = 1'b0;
    

//     parameter xd = 21'd2000000;    //计时_20ms

//     always@(posedge clk) begin    //消抖计时
//     if(key == 5'b00000)    //抖动即重新开始
//         cnt_xd <= 0;
//     else if(cnt_xd == xd)
//         cnt_xd <= xd;
//     else
//         cnt_xd <= cnt_xd + 1;
//     end

//     always@(posedge clk) begin
//     if(cnt_xd == 0)
//         key_out <= 0;
//     else if(cnt_xd == (xd - 21'b1))    //产生1个时间单位的按键信号
//         case(key)     //根据键入得到对应的值
//         5'b10000: key_out <= 1;
//         5'b01000: key_out <= 2;
//         5'b00100: key_out <= 3;
//         5'b00010: key_out <= 4;
//         5'b00001: key_out <= 5;
//         endcase
//     else
//         key_out <= 0;   //0表示无按键按下
//     end
    
//     always@(posedge clk)  begin   //价格调整
//     if(key_out == 4 & sl == 1)
//         zt = ~zt;
//     else if(key_out == 5 & zt == 1)
//         begin
//         price = price + 1;
//         if(price == 16)
//             price = 1;
//         else
//             price = price;
//         zj = price;    
//         end       
//     else if(key_out == 5 & zt == 0)
//     begin
//         zj = zj + price;
//         sl = sl + 1;
//     end
//     else if(cs == 29'd300000000)
//     begin
//         sl = 1;
//         zj = price;
//     end
//     else
//     begin
//         price = price;
//         zj = zj;
//     end
//     end

//     always@(posedge clk) begin
//     if(money >= zj)    //投入钱数大于价格时，禁止投币，计时3s后迎接下一个消费者
//     begin
//         if(cs == 29'd300000000)   //3s计时
//         begin           
//             money <= 0;    //钱置零
//             cs <= 0;
//         end
//         else
//             cs <= cs + 1;
//     end
//     else if(key_out == 1 & zt ==0)   //按下S0
//         money <= money + 1; //表示投入1块钱
//     else if(key_out == 2 & zt ==0)   //下面同理
//         money <= money + 5;
//     else if(key_out == 3 & zt ==0)
//         money <= money + 10;
//     else
//         money <= money;   //钱数不变
//     end
    
//     always@(posedge clk) begin    //控制数码管的闪烁
//     if(zt == 1)
//     begin
//         if(cnt_s == 26'd50000000)   //0.5s变换
//         begin
//             cnt_s <= 0;
//             shine <= ~shine;     //暗灭转换
//         end
//         else
//             cnt_s <= cnt_s + 1;
//     end
//     else
//         cnt_s <= 0;  
//     end

//     always@(posedge clk) begin   //数码管扫描计时
//     if(cnt == 18'd200000)  //500Hz
//     begin
//         cnt <= 0;
//         DIR <= 1'b1;   //产生一个上升沿
//     end
//     else
//     begin
//         cnt <= cnt +1;
//         DIR <= 1'b0;
//     end   
//     end

//     always@(posedge clk)begin 
//     if(money >= zj)   //当输入钱数大于3，找零
//     begin
//         light <= 8'b11111111;  //LED全亮，表示购买成功
//         change <= money - zj;
//     end
//     else
//     begin
//         change <= 0;    //未达到，不找零（即为0）
//         light <= 8'b10000000;    //只亮一位LED，表示饮料机正常运行
//     end
//     end


//     always@(posedge DIR) begin
//     if(cnt_wz == 7)
//         cnt_wz <= 0;
//     else
//         cnt_wz <= cnt_wz + 1;  //cnt_wz表示不同数码管的状态
//     end
    
//     always@(posedge clk) begin   //根据cd的值来计算不同类型的时间
//     case(cnt_wz)
//     3'd0: cd <= zj;
//     3'd3: cd <= money;
//     3'd6: cd <= change;
//     default: cd <= cd;
//     endcase      
//     end

//     always@(posedge clk)   //用来控制移位
//     begin
//         if(count == 9)    //由于这里原码为8bit，故只需要移位10位就可以得到结果
//             count <= 0;
//         else
//             count <= count + 1;                 
//     end

//     always@(posedge clk) begin   //下面程序完成二进制码到BCD码的变换
//     if(count == 0)
//         shift_reg={10'b0000000000,cd};
//     else if (count<=8) 
//     begin
//         if(shift_reg[11:8] >= 5)   //大于等于5就加3，下面同理
//         begin
//             if(shift_reg[15:12] >= 5)
//                 begin
//                 shift_reg[15:12]=shift_reg[15:12]+2'b11;    
//                 shift_reg[11:8]=shift_reg[11:8]+2'b11;
//                 shift_reg = shift_reg<<1;
//                 end 
//              else
//              begin
//                 shift_reg[15:12]=shift_reg[15:12];
//                 shift_reg[11:8]=shift_reg[11:8]+2'b11;
//                 shift_reg=shift_reg<<1;
//              end
//          end
//          else
//          begin
//               if(shift_reg[15:12] >= 5)
//                   begin
//                   shift_reg[15:12]=shift_reg[15:12]+2'b11;
//                   shift_reg[11:8]=shift_reg[11:8];
//                   shift_reg=shift_reg<<1;
//                   end
//               else
//                 begin
//                  shift_reg[15:12]=shift_reg[15:12];
//                  shift_reg[11:8]=shift_reg[11:8];
//                  shift_reg=shift_reg<<1;
//                  end
//           end
//        end
//     end

//     always@(posedge clk) begin
//     if(count==9)  //移位结束 
//     begin
//         gw <= shift_reg[11:8];    //个位
//         sw <= shift_reg[15:12];   //十位
//     end
//     else
//     begin
//         gw <= gw;
//         sw <= sw;
//     end 
//     end

//     always@(posedge clk) begin
//     case(cnt_wz)   //决定哪一位数码管亮
//         3'd0: begin
//             if(zt == 0)
//                 wz <= 8'b10000000;
//             else if(zt == 1 & shine == 1)
//                 wz <= 8'b00000000;
//             else
//                 wz <= 8'b10000000;
//            end
//         3'd1: begin
//             if(zt == 0)
//                 wz <= 8'b01000000;
//             else if(zt == 1 & shine == 1)
//                 wz <= 8'b00000000;
//             else
//                 wz <= 8'b01000000;
//            end
//         3'd2: wz <= 8'b00100000;
//         3'd3: wz <= 8'b00010000;
//         3'd4: wz <= 8'b00001000;
//         3'd5: wz <= 8'b00000100;
//         3'd6: wz <= 8'b00000010;
//         3'd7: wz <= 8'b00000001;
//         default: wz <= 8'b00000000;
//     endcase
//     end

//     always@(posedge clk) begin
//     case(cnt_wz)    //数码管要要显示的数值
//     4'd0: num <= sw;  //饮料价格
//     4'd1: num <= gw;   
//     4'd2: num <= 12;  //12无意义，仅用于下面的判断
//     4'd3: num <= sw;
//     4'd4: num <= gw;
//     4'd5: num <= 12;   //本12同理上面
//     4'd6: num <= sw;
//     4'd7: num <= gw;
//     default: num <= 0;
//     endcase
//     end

//     always @(posedge clk) begin
//     if(num <= 9)
//         case(num)   //根据钱数决定输出的段码
//         4'd0: smg <= 8'b11111100;
//         4'd1: smg <= 8'b01100000;
//         4'd2: smg <= 8'b11011010;
//         4'd3: smg <= 8'b11110010;
//         4'd4: smg <= 8'b01100110;
//         4'd5: smg <= 8'b10110110;
//         4'd6: smg <= 8'b10111110;
//         4'd7: smg <= 8'b11100000;
//         4'd8: smg <= 8'b11111110;
//         4'd9: smg <= 8'b11110110;
//         default: smg <= 8'b00000000;
//         endcase
//     else
//         smg <= 8'b00000010;    //不同类型间的分隔符
//     end

//     assign seg_data0 = smg;    //段码输送
//     assign seg_data1 = smg;
//     assign seg_cs = wz;     //位选输送
//     assign led = light;    //LED输送
// endmodule